package chapter07

/**
  *
  * @author Pop
  * @date 2022/6/30 22:44
  */
object   Test12_DerivedCollection {
  def main(args: Array[String]): Unit = {

    val list1 = List(1,3,4,5)
    val list2 = List(4,566,6)

    // 获取集合的头
    println(list1.head)
    // 获取集合的尾巴，这个尾巴，并不是指最后一个元素，而是除了头，剩下的都是尾巴
    println(list1.tail)
    // 获取集合的最后一个元素
    println(list1.last)

    // 集合初始数据（不包含最后一个）和tail是相反的
    println(list2.init)

    // 反转
    println(list2.reverse)

    // 取前后n个元素
    println(list1.take(3))
    // 取后面的某几个元素
    println(list1.takeRight(3))
    //去掉前后n个元素
    println(list1.drop(3))
    println(list1.dropRight(3))

    //以上都会衍生出新的集合类型

    // 并集
    val list4: List[Int] = list1.union(list2)
    println(list1 ::: list2)//效果是一样的，不过要注意的是，对set来说，会去重

    // 交集
    val intersect: List[Int] = list1.intersect(list2)
    // 差集  属于list1但是不属于list2的元素
    val diff: List[Int] = list1.diff(list2)
    // 属于list1但是不属于list2的
    val diff2: List[Int] = list2.diff(list1)

    // 拉链 ，现实生活中的拉链是两边锯齿，通过滑锁进行咬合，一一配对
    // 对于集合来说，将集合相同索引位置的元素，一一配对，成为一个二元组
    // 多出来的部分直接废弃，这就是拉链的用法

    println(list1.zip(list2))
    println(list2.zip(list1))

    // 滑窗 要的一个长度为n的滑动窗口
    val iterator: Iterator[List[Int]] = list1.sliding(3)
    // 第二个窗口是步长，表示上一个窗口与下一个窗口相差多少个元素
    val iterator2: Iterator[List[Int]] = list1.sliding(3,2)
    for (elem <- iterator){
      // 是一个一个的长度为3的list
      println(elem)
    }
  }


}
